home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / Peter Lewis (TCPExample) / PNL Libraries / MyUtils.p < prev    next >
Encoding:
Text File  |  1995-12-11  |  11.1 KB  |  478 lines  |  [TEXT/CWIE]

  1. unit MyUtils;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Quickdraw, Types, TextUtils, Events, Windows, MyTypes;
  7.         
  8.     const
  9.         my_font_strh_id = 1900;
  10.     
  11.     type
  12.         SavedWindowInfo = record
  13.                 oldport: GrafPtr;
  14.                 thisport: GrafPtr;
  15.                 font: integer;
  16.                 size: integer;
  17.                 face: Style;
  18.             end;
  19.  
  20.     type
  21.         MyFontType = (
  22.                 MFT_Geneva0, MFT_Geneva9, MFT_Geneva12, 
  23.                 MFT_Courier0, MFT_Courier9, MFT_Courier12,
  24.                 MFT_Chicago0, MFT_Chicago9, MFT_Chicago12,
  25.                 MFT_System0, MFT_System9, MFT_System12,
  26.                 MFT_Monaco0, MFT_Monaco9, MFT_Monaco12
  27.                 );
  28.  
  29.     procedure GetMyFonts(ft:MyFontType; var font, size:integer);
  30.     procedure SetMyFont(ft:MyFontType);
  31.     function MyTrapAvailable (tNumber: INTEGER): BOOLEAN;
  32.     function MyNumToString (n: longint): Str255;
  33.     function NumToK(n:longint; extra:boolean):Str255;
  34.     function NumToStr (n: longint): Str15;
  35.     function NN (n: longint; len: integer): Str15;
  36.     function N2 (n: longint): Str15;
  37.     function HexN (n: longint): Char;
  38.     function HexN2 (n: longint): Str15;
  39.     function HexNN (n: longint; len: integer): Str15;
  40.     function HexToNum (s: Str15): longint;
  41.     function StrToNum (s: Str255): longint;
  42.     procedure DotDotDot (var s: Str255; var width: integer);
  43.     procedure PlotSICN (typ:OSType; id, index, v, h: integer);
  44.     function LookupStrh (id: integer; match: Str255): Str255;
  45.     function LookupStrhNumber (id: integer; n: longint): Str255;
  46.     function DirtyKey (ch: char): boolean;
  47.     function SendCharToIsDialogEvent (var er: EventRecord; cs: charSet): boolean;
  48.     function GetVersionFromResFile: longint;
  49.     procedure MySetTrapAddress (addr: UniversalProcPtr; trapword: integer);
  50.     function MyGetTrapAddress (trapword: integer): UniversalProcPtr;
  51.     procedure SafeDeviceLoop (drawingRgn: RgnHandle; drawingProc: DeviceLoopDrawingProcPtr; userData: univ longint; flags: DeviceLoopFlags);
  52.     procedure SafeDeviceLoopRect (drawingRect: Rect; drawingProc: DeviceLoopDrawingProcPtr; userData: univ longint; flags: DeviceLoopFlags);
  53. { procedure drawingProc (depth: integer; deviceFlags: integer; targetDevice: GDHandle; item: longint); }
  54.     procedure MakeRGBColor (red, green, blue: integer; var col: RGBColor);
  55.     function IsExtensionVar (var name, ext: Str255): boolean;
  56.     function IsExtension (name, ext: Str255): boolean;
  57.     function IsPrefix (name, prefix: Str255): boolean;
  58.     function TPbtst(value:longint; bit:integer):Boolean;
  59.     procedure SetInvertHiliteMode;
  60.     procedure HiliteInvertRect (r: rect);
  61.     procedure HiliteInvertRgn (r: RgnHandle);
  62.     procedure FixScrap;
  63.     procedure HaveResources;
  64.  
  65. implementation
  66.  
  67.     uses
  68.         Scrap, QuickdrawText, OSUtils, Packages, ToolUtils, Resources, 
  69.         Memory, Processes, Folders, Traps, Fonts,
  70.         MyStrings, MyCallProc;
  71.  
  72.     const
  73.         HiliteMode = $938;
  74.  
  75.     procedure SetInvertHiliteMode;
  76.     begin
  77.         BitClr(POINTER(HiliteMode), pHiliteBit);
  78.     end;
  79.     
  80.     procedure HiliteInvertRect (r: rect);
  81.     begin
  82.         SetInvertHiliteMode;
  83.         InvertRect(r);
  84.     end;
  85.  
  86.     procedure HiliteInvertRgn (r: RgnHandle);
  87.     begin
  88.         SetInvertHiliteMode;
  89.         InvertRgn(r);
  90.     end;
  91.  
  92.     function TPbtst(value:longint; bit:integer):Boolean;
  93.     begin
  94.         TPbtst := btst(value, bit);
  95.     end;
  96.     
  97.     procedure GetMyFonts(ft:MyFontType; var font, size:integer);
  98.         var
  99.             s:Str255;
  100.             n:longint;
  101.     begin
  102.         GetIndString(s,my_font_strh_id,2*ord(ft) + 1);
  103.         GetFNum(s,font);
  104.         GetIndString(s,my_font_strh_id,2*ord(ft) + 2);
  105.         StringToNum(s,n);
  106.         size := n;
  107.     end;
  108.     
  109.     procedure SetMyFont(ft:MyFontType);
  110.         var
  111.             font, size:integer;
  112.     begin
  113.         GetMyFonts(ft, font, size);
  114.         TextFont(font);
  115.         TextSize(size);
  116.     end;
  117.     
  118.     function IsExtensionVar (var name, ext: Str255): boolean;
  119.         var
  120.             pn, pe: integer;
  121.     begin
  122.         if false then begin
  123.             IsExtensionVar := IUEqualString(TPCopy(name, length(name) - length(ext) + 1, 255), ext) = 0;
  124.         end else begin
  125.             IsExtensionVar := false;
  126.             if length(name) >= length(ext) then begin
  127.                 pn := length(name) - length(ext) + 1;
  128.                 pe := 1;
  129.                 while pe <= length(ext) do begin
  130.                     if UpCase(name[pn]) <> UpCase(ext[pe]) then begin
  131.                         leave;
  132.                     end;
  133.                     pn := pn + 1;
  134.                     pe := pe + 1;
  135.                 end;
  136.                 IsExtensionVar := pe > length(ext);
  137.             end;
  138.         end;
  139.     end;
  140.  
  141.     function IsExtension (name, ext: Str255): boolean;
  142.     begin
  143.         IsExtension := IsExtensionVar(name, ext);
  144.     end;
  145.  
  146.     function IsPrefix (name, prefix: Str255): boolean;
  147.     begin
  148.         IsPrefix := IUEqualString(TPCopy(name, 1, length(prefix)), prefix) = 0;
  149.     end;
  150.     
  151.     procedure MakeRGBColor (red, green, blue: integer; var col: RGBColor);
  152.     begin
  153.         col.red := red;
  154.         col.green := green;
  155.         col.blue := blue;
  156.     end;
  157.  
  158.     procedure SafeDeviceLoop (drawingRgn: RgnHandle; drawingProc: DeviceLoopDrawingProcPtr; userData: univ longint; flags: DeviceLoopFlags);
  159.     begin
  160.         if MyTrapAvailable(_DeviceLoop) then begin
  161.             DeviceLoop(drawingRgn, drawingProc, userData, flags);
  162.         end else begin
  163.             CallPascal02244(1, 0, nil, userData, drawingProc);
  164.         end;
  165.     end;
  166.  
  167.     procedure SafeDeviceLoopRect (drawingRect: Rect; drawingProc: DeviceLoopDrawingProcPtr; userData: univ longint; flags: DeviceLoopFlags);
  168.         var
  169.             rgn: RgnHandle;
  170.     begin
  171.         rgn := NewRgn;
  172.         RectRgn(rgn, drawingRect);
  173.         SafeDeviceLoop(rgn, drawingProc, userData, flags);
  174.         DisposeRgn(rgn);
  175.     end;
  176.  
  177.     function GetVersionFromResFile: longint;
  178.         var
  179.             versh: VersRecHndl;
  180.     begin
  181.         GetVersionFromResFile := 0;
  182.         versh := VersRecHndl(Get1Resource('vers', 1));
  183.         if versh <> nil then begin
  184.             GetVersionFromResFile := longint(versh^^.numericVersion);
  185.         end; (* if *)
  186.     end;
  187.  
  188.     function MyTrapAvailable (tNumber: INTEGER): BOOLEAN;
  189. {Check to see if a given trap is implemented. Babble as taken from IM6 }
  190.         const
  191.             TrapMask = $0800;
  192.         var
  193.             tType: TrapType;
  194.             numtraps: integer;
  195.     begin
  196.         tType := TrapType(TPbtst(tNumber, 11));
  197.         if (tType = ToolTrap) then begin
  198.             if NGetTrapAddress($A86E, ToolTrap) = NGetTrapAddress($AA6E, ToolTrap) then begin
  199.                 numtraps := $0200;
  200.             end else begin
  201.                 numtraps := $0400;
  202.             end;
  203.             if BAND(tNumber, $07FF) >= numtraps then begin
  204.                 tNumber := _Unimplemented;
  205.             end;
  206.         end;
  207.         MyTrapAvailable := MyGetTrapAddress(tNumber) <> MyGetTrapAddress(_Unimplemented);
  208.     end;
  209.  
  210.     function MyNumToString (n: longint): Str255;
  211.         var
  212.             s, t: Str255;
  213.     begin
  214.         if abs(n) < 4096 then begin
  215.             NumToString(n, s)
  216.         end else if abs(n) < 4194304 then begin
  217.             NumToString(n div 1024, s);
  218.             GetIndString(t, 935, 2);
  219.             s := Concat(s, t);
  220.         end else begin
  221.             GetIndString(t, 935, 3);
  222.             NumToString(n div 1048576, s);
  223.             s := Concat(s, t);
  224.         end;
  225.         MyNumToString := s;
  226.     end;
  227.  
  228.     function NumToK(n:longint; extra:boolean):Str255;
  229.         const
  230.             K = 1024;
  231.             M = 1048576;
  232.         var
  233.             f:integer;
  234.             s, dot:Str255;
  235.     begin
  236.         if (n < 1048576) & extra then begin
  237.             n := n*1024;
  238.             extra := false;
  239.         end;
  240.         if (n < K) then begin 
  241.             { extra is false }
  242.             NumToString(n,s);
  243.         end else begin
  244.             { n >= K }
  245.             f := ord(extra);
  246.             while n >= M do begin
  247.                 f := f + 1;
  248.                 n := n div K;
  249.             end;
  250.             { K <= n < M } { Display n/1024 GetIndStr(935,f+2) }
  251.             GetIndString(s, 935, f+2);
  252.             GetIndString(dot, 935, 1);
  253.             if n>=1024000 then begin
  254.                 n := n div 1024;
  255.                 s := concat(NumToStr(n),s);
  256.             end else if n>=102400 then begin
  257.                 n:= n*10 div 1024;
  258.                 s := concat(NumToStr(n div 10),dot,NN(n mod 10,1),s);
  259.             end else if n>=10240 then begin
  260.                 n:= n*100 div 1024;
  261.                 s := concat(NumToStr(n div 100),dot,NN(n mod 100,2),s);
  262.             end else begin
  263.                 n := n*1000 div 1024;
  264.                 s := concat(NumToStr(n div 1000),dot,NN(n mod 1000,3),s);
  265.             end;
  266.         end;
  267.         NumToK:=s;
  268.     end;
  269.     
  270.     function NumToStr (n: longint): Str15;
  271.         var
  272.             s: Str255;
  273.     begin
  274.         NumToString(n, s);
  275.         NumToStr := s;
  276.     end;
  277.  
  278.     function NN (n: longint; len: integer): Str15;
  279.         var
  280.             s: Str255;
  281.     begin
  282.         if len > 15 then begin
  283.             len := 15;
  284.         end;
  285.         NumToString(n, s);
  286.         while length(s) < len do begin
  287.             s := concat('0', s);
  288.         end;
  289.         NN := s;
  290.     end;
  291.  
  292.     function N2 (n: longint): Str15;
  293.     begin
  294.         N2 := NN(n, 2);
  295.     end;
  296.  
  297.     function HexN (n: longint): Char;
  298.     begin
  299.         n := BAND(n, $F);
  300.         if n >= 10 then begin
  301.             n := n + 7;
  302.         end;
  303.         n := n + 48;
  304.         HexN := Chr(n);
  305.     end;
  306.  
  307.     function HexN2 (n: longint): Str15;
  308.     begin
  309.         HexN2 := concat(HexN(BSR(n, 4)), HexN(n));
  310.     end;
  311.  
  312.     function HexNN (n: longint; len: integer): Str15;
  313.         var
  314.             s: Str15;
  315.     begin
  316.         if len > 15 then begin
  317.             len := 15;
  318.         end;
  319.         s := HexN(n);
  320.         while length(s) < len do begin
  321.             n := BAND(BSR(n, 4), $0FFFFFFF);
  322.             s :=concat(HexN(n), s);
  323.         end;
  324.         HexNN := s;
  325.     end;
  326.  
  327.     function HexToNum (s: Str15): longint;
  328.         var
  329.             n: longint;
  330.             i, v: integer;
  331.     begin
  332.         i := 1;
  333.         n := 0;
  334.         while (i <= length(s)) & (s[i] in ['A'..'Z', 'a'..'z', '0'..'9']) do begin
  335.             case s[i] of
  336.                 'A'..'Z': 
  337.                     v := ord(s[i]) - 55;
  338.                 'a'..'z': 
  339.                     v := ord(s[i]) - 87;
  340.                 '0'..'9': 
  341.                     v := ord(s[i]) - 48;
  342.             end;
  343.             n := BSL(n, 4) + v;
  344.             i := i + 1;
  345.         end;
  346.         HexToNum := n;
  347.     end;
  348.  
  349.     function StrToNum (s: Str255): longint;
  350.         var
  351.             n: longint;
  352.     begin
  353.         StringToNum(s, n);
  354.         StrToNum := n;
  355.     end;
  356.  
  357.     procedure DotDotDot (var s: Str255; var width: integer);
  358.         var
  359.             maxwidth, len: integer;
  360.     begin
  361.         maxwidth := width;
  362.         width := StringWidth(s);
  363.         if width > maxwidth then begin
  364.             width := width + CharWidth('…');
  365. {$PUSH}
  366. {$R-}
  367.             len := ord(s[0]);
  368.             while (len > 0) and (width > maxwidth) do begin
  369.                 width := width - CharWidth(s[len]);
  370.                 len := len - 1;
  371.             end;
  372.             len := len + 1;
  373.             s[0] := chr(len);
  374.             s[len] := '…';
  375. {$POP}
  376.         end;
  377.     end;
  378.  
  379.     procedure PlotSICN (typ:OSType; id, index, v, h: integer);
  380.         var
  381.             sh: Handle;
  382.             bm: BitMap;
  383.             r: Rect;
  384.             gp: grafptr;
  385.     begin
  386.         sh := GetResource(typ, id);
  387.         HLock(sh);
  388.         bm.baseAddr := Ptr(longint(sh^) + (index - 1) * 32);
  389.         bm.rowBytes := 2;
  390.         SetRect(r, h, v, h + 16, v + 16);
  391.         bm.bounds := r;
  392.         GetPort(gp);
  393.         CopyBits(bm, gp^.portBits, r, r, srcCopy, nil);
  394.         HUnlock(sh);
  395.         HPurge(sh);
  396.     end;
  397.  
  398.     function LookupStrh (id: integer; match: Str255): Str255;
  399.         var
  400.             t, s: Str255;
  401.             i: integer;
  402.     begin
  403.         t := '';
  404.         i := 1;
  405.         repeat
  406.             GetIndString(s, id, i);
  407.             if s = match then begin
  408.                 GetIndString(t, id, i + 1);
  409.                 leave;
  410.             end;
  411.             i := i + 2;
  412.         until s = '';
  413.         LookupStrh := t;
  414.     end;
  415.  
  416.     function LookupStrhNumber (id: integer; n: longint): Str255;
  417.         var
  418.             s, t: Str255;
  419.     begin
  420.         NumToString(n, s);
  421.         t := LookupStrh(id, s);
  422.         if t = '' then begin
  423.             t := s;
  424.         end;
  425.         LookupStrhNumber := t;
  426.     end;
  427.  
  428.     function DirtyKey (ch: char): boolean;
  429.     begin
  430.         DirtyKey := not (ord(ch) in [homeChar, endChar, helpChar, pageUpChar, pageDownChar, leftArrowChar, rightArrowChar, upArrowChar, downArrowChar]);
  431.     end;
  432.  
  433.     function SendCharToIsDialogEvent (var er: EventRecord; cs: charSet): boolean;
  434.         var
  435.             ch: char;
  436.     begin
  437.         SendCharToIsDialogEvent := true;
  438.         if ((er.what = keyDown) | (er.what = autoKey)) & (BAND(er.modifiers, cmdKey) = 0) then begin
  439.             ch := chr(BAND(er.message, $FF));
  440.             if not (ch in (cs + [tab, del, bs])) & DirtyKey(ch) then begin
  441.                 SendCharToIsDialogEvent := false;
  442.             end;
  443.         end;
  444.     end;
  445.  
  446.     function MyGetTrapAddress (trapword: integer): UniversalProcPtr;
  447.     begin
  448.         MyGetTrapAddress := UniversalProcPtr(NGetTrapAddress(trapword, TrapType(TPbtst(trapword, 11))));
  449.     end;
  450.  
  451.     procedure MySetTrapAddress (addr: UniversalProcPtr; trapword: integer);
  452.     begin
  453.         NSetTrapAddress(addr, trapword, TrapType(TPbtst(trapword, 11)));
  454.     end;
  455.  
  456.     procedure FixScrap;
  457.         var
  458.             scrap: ScrapStuffPtr;
  459.             junk, offset: longint;
  460.     begin
  461.         scrap := InfoScrap;
  462.         if scrap^.scrapHandle = nil then begin
  463.             scrap^.scrapState := -1;
  464.         end;
  465.         junk := GetScrap(nil, 'XXXX', offset);
  466.         junk := UnloadScrap;
  467.     end;
  468.  
  469.     procedure HaveResources;
  470.     begin
  471.         if Get1Resource('BNDL', 128) = nil then begin
  472.             SysBeep(1);
  473.             ExitToShell;
  474.         end;
  475.     end;
  476.  
  477. end.
  478.